/**
 * Project: MavenQuickStartSpringMvcJsp
 * 
 * File Created at 2015年3月13日
 * 
 * Copyright 2012 Greenline.com Corporation Limited.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of
 * Greenline Company. ("Confidential Information").  You shall not
 * disclose such Confidential Information and shall use it only in
 * accordance with the terms of the license agreement you entered into
 * with Greenline.com.
 */
/**
 * @Type package-info
 * @Desc 
 * 　状态模式，又称状态对象模式（Pattern of Objects for States），状态模式是对象的行为模式。
 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

 状态模式的结构
 状态模式所涉及到的角色有：
 ●　　环境(Context)角色，也成上下文：定义客户端所感兴趣的接口，并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
 ●　　抽象状态(State)角色：定义一个接口，用以封装环境（Context）对象的一个特定的状态所对应的行为。
 ●　　具体状态(ConcreteState)角色：每一个具体状态类都实现了环境（Context）的一个状态所对应的行为。


 状态模式vs策略模式
 相同点
 ●添加新的状态或策略都很容易，而且不需要修改使用它们的Context对象。
 ●它们都让你的代码符合OCP原则。在状态模式和策略模式中，Context对象对修改是关闭的，添加新的状态或策略，都不需要修改Context。
 ●正如状态模式中的Context会有初始状态一样，策略模式同样有默认策略。
 ●状态模式以不同的状态封装不同的行为，而策略模式以不同的策略封装不同的行为。
 ●它们都依赖子类去实现相关行为。

 不同点
 ●策略模式封装了一组相关算法，它允许Client在运行时使用可互换的行为；状态模式帮助一个类在不同的状态显示不同的行为。
 ●状态模式封装了对象的状态，而策略模式封装算法或策略。因为状态是跟对象密切相关的，它不能被重用；而通过从Context中分离出策略或算法，我们可以重用它们。
 ●在状态模式中，每个状态通过持有Context的引用，来实现状态转移；但是每个策略都不持有Context的引用，它们只是被Context使用。
 ●策略实现可以作为参数传递给使用它的对象，例如Collections.sort()，它的参数包含一个Comparator策略。另一方面，状态是Context对象自己的一部分，
 随着时间的推移，Context对象从一个状态转移到另一个状态。
 ●虽然它们都符合OCP原则，策略模式也符合SRP原则（单一职责原则），因为每个策略都封装自己的算法，且不依赖其他策略。一个策略的改变，并不会导致其他策略的变化。
 ●另一个理论上的不同：策略模式定义了对象“怎么做”的部分。例如，排序对象怎么对数据排序。状态模式定义了对象“是什么”和“什么时候做”的部分。
 例如，对象处于什么状态，什么时候处在某个特定的状态。
 ●状态模式中很好的定义了状态转移的次序；而策略模式并无此需要：Client可以自由的选择任何策略。
 ●一些常见的策略模式的例子是封装算法，例如排序算法，加密算法或者压缩算法。如果你看到你的代码需要使用不同类型的相关算法，
 那么考虑使用策略模式吧。而识别何时使用状态模式是很简单的：如果你需要管理状态和状态转移，但不想使用大量嵌套的条件语句，那么就是它了。
 ●最后但最重要的一个不同之处是，策略的改变由Client完成；而状态的改变，由Context或状态自己。
 * @author Administrator
 * @date 2015年3月13日
 * @Version V1.0
 */
package desgin.pattern.behavior.state;